package Thread.ReentantLock;

import java.util.concurrent.locks.ReentrantLock;

public class Demo42 {
    public static  int count=0;
    public static void main(String[] args) throws InterruptedException {
        //ReentrantLock是可重入锁，可以重复加锁，但是必须加锁和释放锁成对出现
        //ReentrantLock是独占锁，同一时间只能有一个线程访问
        //ReentrantLock是公平锁（默认状态是不公平的，构造时加一个true参数），按照线程的请求顺序来分配锁
        //ReentrantLock是可中断锁，可以中断正在等待的线程
        //ReentrantLock是可绑定条件锁，可以绑定多个条件，每个条件都可以唤醒一个线程
        ReentrantLock locker=new ReentrantLock(true);
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                locker.lock();
                count++;
                locker.unlock();
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                locker.lock();
                count++;
                locker.unlock();
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("count ="+count);
        //reentantLock是标准库提供的类通过Java代码实现的
        //synchronized是Java语言关键字，通过Java字节码实现的
        //reentantLock的unlock可能会被遗漏，unlock放到finally中
        //reentantLock提供了trylock的方式加锁，只要加锁失败就会直接返回，通过返回值来告诉程序员结果，并不会阻塞等待

    }
}
